package com.liu.algorithm.class01;

public class Code01_PrintBinary {

    /**
     * 打印32位二进制
     * &  与运算 都为1输出1
	 * << 左移
	 * (num & (1 << i)) == 0  当与运算等于0时输出0其余为1
     */
    public static void print(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }

    public static void main(String[] args) {
//		int demo = 1;
//		print(demo);
//		print(demo<<1);
//		System.out.println(demo << 1);
//		print(demo<<2);
//		print(demo<<8);
//
//		//int整形的最大值 01111111111111111111111111111111
//		int max = Integer.MAX_VALUE;
//		print(max);
//		//2147483647
//		System.out.println("整形最大值："+ max);
//		//int整形的最小值 10000000000000000000000000000000
//		int min = Integer.MIN_VALUE;
//		print(min);

//		//11111111111111111111111111111111  有符号位整数 负数符号位1 计算方式:去掉符号位值取反加1
//		// 0000000000000000000000000000000  整数表示 -(0+1=1)
//		print(-1);
//		//11111111111111111111111111111011
//		// 0000000000000000000000000000100 整数表示 -(4+1=1)
//		print(-5);

//		//~取反 二进制数按位取反，即将0变1，将1
//		//00000111011000010110010000100010
//		//11111000100111101001101111011101
//		int b = 123823138;
//		print(b);
//		print(~b);

//		int a = 12319283;
//		int b = 3819283;
//		print(a);
//		print(b);
//		System.out.println("=============");
//        // | 按位或  只要有一个为1，该位的结果值为1
//		print(a | b);
//        // & 按位与  二进制位都为1，则该位的结果值为1，否则为0
//		print(a & b);
//        // ^ 按位异或  两个二进制位值相同则为0，否则为1
//		print(a ^ b);

//		int a = Integer.MIN_VALUE;
//		//               10000000000000000000000000000000
//		print(a);
//		//>> 带符号右移    11000000000000000000000000000000
//		print(a >> 1);
//		//>>>不带符号右移  01000000000000000000000000000000
//		print(a >>> 1);

		int c = Integer.MIN_VALUE;
        // 取负数可以表示(~c + 1)
		int d = -c ;
        //系统最小值取负数值是自己
		print(c);
		print(d);
    }

}
